Repository navigation
v26.48.0 release notes - #40113
Open
bosconi wants to merge 18 commits into
Open
v26.48.0 release notes#40113bosconi wants to merge 18 commits into
bosconi wants to merge 18 commits into
Conversation
| - **External autoscaling for the connection balancer**: The `Materialize` resource gains a `balancerdExternallyScaled` field, and `Balancer` an `externallyScaled` field, that stop the Kubernetes operator from reasserting the balancerd Deployment's replica count on every reconcile, so a HorizontalPodAutoscaler can own it; `balancerdReplicas` then only seeds the count when the Deployment is first created. | ||
|
|
||
| ### Guides {#v26.48-guides} | ||
| - [Transactional downstream updates using Kafka](/export-data/patterns/transactional-downstream-updates-kafka/) |
Contributor
Contributor
|
Pushed two commits to this branch for the Kafka sink headers GA:
Related:
🤖 Generated with Claude Code |
maheshwarip
added a commit
that referenced
this pull request
Oct 28, 2026
### Motivation Adds the upsert source hydration improvement to the v26.48.0 release notes. This PR targets the release notes branch of #40113, not `main`. ### Description - New feature section, **Improved hydration times and memory efficiency for upsert sources** (`{#v26.48-upsert-hydration}`), placed first under `## v26.48.0`. - New chart `doc/user/static/images/releases/v2648_upsert_hydration.png`, comparing old and new hydration time and peak memory plus disk usage. - Hydration time comes from the "Catch-up" row of the benchmark run (206.1 min old vs 107.9–113.3 min new across four tested configurations). The peak memory plus disk figures (542 GiB old vs 183–208 GiB new) were supplied separately. - Links to the blog post: https://materialize.com/blog/materialize-out-of-core/ ### Verification Checked the rendered chart image and the Markdown section by hand. --- _Generated by [Claude Code](https://claude.ai/code/session_016DcnmrsjsfSMzxGBGkmEuK)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
maheshwarip
force-pushed
the
docs/v26.48.0-release-notes
branch
from
October 28, 2026 18:50
d6d8443 to
68501f0
Compare
maheshwarip
added a commit
that referenced
this pull request
Oct 28, 2026
### Motivation Adds the upsert source hydration improvement to the v26.48.0 release notes. This PR targets the release notes branch of #40113, not `main`. ### Description - New feature section, **Improved hydration times and memory efficiency for upsert sources** (`{#v26.48-upsert-hydration}`), placed first under `## v26.48.0`. - New chart `doc/user/static/images/releases/v2648_upsert_hydration.png`, comparing old and new hydration time and peak memory plus disk usage. - Hydration time comes from the "Catch-up" row of the benchmark run (206.1 min old vs 107.9–113.3 min new across four tested configurations). The peak memory plus disk figures (542 GiB old vs 183–208 GiB new) were supplied separately. - Links to the blog post: https://materialize.com/blog/materialize-out-of-core/ ### Verification Checked the rendered chart image and the Markdown section by hand. --- _Generated by [Claude Code](https://claude.ai/code/session_016DcnmrsjsfSMzxGBGkmEuK)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
maheshwarip
reviewed
Oct 28, 2026
val-materialize
added a commit
that referenced
this pull request
Oct 29, 2026
…ader (#40120) Adds a new **Export data > Patterns** section with one page, **Transactional downstream updates using Kafka**. The page shows how a consumer loading a Kafka sink into another store (Snowflake example) can expose only timestamps the sink has fully committed, by gating on the sink's progress frontier and joining data and progress records via the `materialize-sink-id` header. ### Where each fact comes from | Fact | Source | |------|--------| | Every message carries `materialize-timestamp` (value is the timestamp as a decimal string) | `src/storage/src/sink/kafka.rs` (`KafkaTxProducer::send`, `time.to_string()`) | | `materialize-sink-id` header value is the sink's `GlobalId` (for example `u123`), emitted when `kafka_sink_emit_sink_id_header` is on | `src/storage/src/sink/kafka.rs` (`sink_id_header: ... sink_id.to_string()`); `src/storage-types/src/dyncfgs.rs` | | Progress record key is `mz-sink-{sink_id}` | `src/storage-client/src/sink.rs` (`ProgressKey::new`) | | Progress record value is JSON `{"frontier":[<ts>],"version":<n>}`; `frontier` is the exclusive upper of committed times | `src/storage/src/sink/kafka.rs` (`ProgressRecord`, `serialize_frontier`, `commit_transaction`, `progress_record_migration` test) | | Progress record is written in the same Kafka transaction as the data | `src/storage/src/sink/kafka.rs` (`commit_transaction`) | | A transaction and progress record are committed on every frontier advance, even with no data | `src/storage/src/sink/kafka.rs` (sink loop, `Event::Progress` branch) | | Default progress topic name `_materialize-progress-{env}-{connection}`, shared by all sinks on a connection; name exposed in `mz_kafka_connections.sink_progress_topic` | `src/storage-types/src/connections.rs` (`progress_topic`); `doc/user/content/sql/create-sink/kafka.md`; `doc/user/content/sql/system-catalog/mz_catalog.md` | | Consumers need `isolation.level=read_committed`; exactly-once details | `doc/user/content/sql/create-sink/kafka.md` (Exactly-once processing) | | `materialize-` header prefix is reserved | `src/storage/src/sink/kafka.rs`; `doc/user/content/sql/create-sink/kafka.md` | | Snowflake connector stores payload in `RECORD_CONTENT`, headers in `RECORD_METADATA:headers`, and the key in `RECORD_METADATA:key` only with `StringConverter` | [Snowflake Kafka connector overview](https://docs.snowflake.com/en/user-guide/kafka-connector-overview) | ### Notes for reviewers - **GA status:** the `materialize-sink-id` header and the `HEADERS` option are GA in v26.48 (#39908 turns both flags on by default), so the page has no private preview caveat. The Kafka sink docs drop their preview callouts in #39829, and the v26.48.0 release notes (#40113) link to this page. - The Snowflake SQL is marked illustrative. The page names no connector settings except `key.converter`, which the Snowflake docs confirm. Part of [SS-504](https://linear.app/materializeinc/issue/SS-504). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Adds the v26.48.0 section to doc/user/content/releases/_index.md and the v26.48 row to the self-managed operator compatibility table. Dates are provisional (Cloud 2026-10-29, Self-Managed 2026-10-30) and are set for real by the final snapshot. Draft with PR links: https://github.com/MaterializeInc/mz-skills/blob/main/data/mz-release-notes/v26.48.0/rc.1/release_notes.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No published increment: the rc.2 snapshot covered one materialize PR (upsert v2 drain performance), held at Borderline because it only runs behind the enable_upsert_v2 dyncfg, which defaults to false at the v26.48.0-rc.2 tag. The four agent-skills PRs in the window were automated docs syncs and were omitted. Provisional dates are unchanged from rc.1 (Cloud 2026-10-29, Self-Managed 2026-10-30), so neither _index.md nor the operator compatibility table changes. This empty commit records that rc.2 was applied so later runs do not re-sweep it.
Adds the rc.3 increment: one Improvements entry for #40065, which makes a read-only environmentd restart in place rather than exit its container when it reboots to pick up DDL changes during zero-downtime upgrade catch-up, so Kubernetes no longer applies crash-restart backoff. Provisional dates are unchanged from rc.1 and rc.2 (Cloud 2026-10-29, Self-Managed 2026-10-30), so the operator compatibility table is untouched.
### Motivation Adds the upsert source hydration improvement to the v26.48.0 release notes. This PR targets the release notes branch of #40113, not `main`. ### Description - New feature section, **Improved hydration times and memory efficiency for upsert sources** (`{#v26.48-upsert-hydration}`), placed first under `## v26.48.0`. - New chart `doc/user/static/images/releases/v2648_upsert_hydration.png`, comparing old and new hydration time and peak memory plus disk usage. - Hydration time comes from the "Catch-up" row of the benchmark run (206.1 min old vs 107.9–113.3 min new across four tested configurations). The peak memory plus disk figures (542 GiB old vs 183–208 GiB new) were supplied separately. - Links to the blog post: https://materialize.com/blog/materialize-out-of-core/ ### Verification Checked the rendered chart image and the Markdown section by hand. --- _Generated by [Claude Code](https://claude.ai/code/session_016DcnmrsjsfSMzxGBGkmEuK)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Drop the GCS persist note, note the new cluster details page on Self-Managed, and list the sub-second freshness and Iceberg sink troubleshooting guides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Match the v26.47 PostgreSQL section and link the MySQL docs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The final snapshot adds no entries: the v26.48.0 tracking issue lists only the version bump commit, and comparing v26.48.0-rc.3...v26.48.0 confirms a single commit on the release branch. The three agent-skills PRs in the window were all omitted. The provisional dates carried since rc.1 (Cloud 2026-10-29, Self-Managed 2026-10-30) match the real ship dates, so the date refresh in _index.md and self_managed_operator_compatibility.yml is a no-op. This commit is empty; it records on the branch that the final snapshot has been applied.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
I'll fix this |
maheshwarip
requested review from
a team,
DAlperin and
SangJunBak
as code owners
October 29, 2026 20:56
maheshwarip
removed request for
a team,
DAlperin,
SangJunBak,
doy-materialize and
jdonelson
October 29, 2026 20:57
Contributor
|
ok fixed - sorry for the review inbox spam team |
maheshwarip
force-pushed
the
docs/v26.48.0-release-notes
branch
from
October 29, 2026 20:57
2c2ac00 to
0061014
Compare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
maheshwarip
approved these changes
Oct 29, 2026
Also expand the Self-Managed cluster details page note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release notes for the v26.48.0 train. One commit is added per snapshot; the
finalsnapshot sets the real dates. Applied:rc.1,rc.2,rc.3,final— the train is complete.EXCLUDE ALL NOT NULL CONSTRAINTS), 9 Improvements, 2 Guides, 4 Bug Fixes. No Agent Skills section — every agent-skills PR in all four windows was omitted.rc.1-anchored provisional estimate was right, sofinalleft both files unchanged. Thev26.48.0tag's commit date is 2026-10-28T18:35:05Z, a Wednesday; the first Thursday on or after it is 2026-10-29, with Self-Managed the day after.v26.48, release date2026-10-30. Unchanged by rc.2, rc.3, and final.main, whose newest published section was## v26.46.1when this branch was cut; v26.47.0 and v26.47.1 have since merged in.v26.48.0stays at the top of the list.final increment — empty, and verified empty
final's commit is empty. The tracking issue (release#627) lists exactly one item, the unassociated4edd60a8d"release: bump to version v26.48.0", which the release-process-automation rule omits. The three agent-skills PRs in the window (#118, #119, #120) were all omitted.This was verified rather than assumed, because a zero-PR snapshot and a failed fetch produce identical output:
compare/v26.48.0-rc.3...v26.48.0returnstotal_commits: 1, and that commit is the version bump. Nothing merged onto the release branch in the 42 h 49 m between therc.3tag and the ship tag. Across the train, every agent-skills PR from #111 to #120 falls in exactly one window, with no gaps or overlaps.v26.48.0ship tag rather than inherited from the RC snapshots:v26.48.0enable_upsert_v2falsesrc/storage-types/src/dyncfgs.rs:505-509enable_upsert_chunked_stashfalsesrc/storage-types/src/dyncfgs.rs:469-475enable_upsert_paged_spillfalsesrc/storage-types/src/dyncfgs.rs:450-455enable_mcp_protocol_2026_07_28falsesrc/adapter-dyncfgs/src/dyncfgs.rs:295-299cluster-details-page-cns-173The rc.2 hold on #40189 rests on a premise this branch now contradicts. rc.2 omitted it at Borderline on exactly one ground — every measurement is taken on a path
enable_upsert_v2keeps off by default — and asked whether any environment actually runs upsert v2. The branch answers that without anyone feeding the answer back: the human-added "Improved hydration times and memory efficiency for upsert sources" section states "This change has been rolled out to all Materialize Cloud environments and applies to all existing and new clusters." The three flags still readfalseat the ship tag, which is exactly the source-default-versus-LaunchDarkly divergence the rollout-lever rule covers: the published docs call wins, and the sole stated reason for the omit has fallen away.finalcommit:main, not the configuration Cloud ran before this rollout — so they are not a clean before/after for a given customer. Dropping the two timings and keeping the linear-versus-quadratic claim holds regardless of baseline.enable_upsert_v2— so publishing this would be an override of an author signal, justified by your own later rollout statement.v26.44.0-rc.1(#39041),v26.45.0-rc.1(#39044),v26.48.0-rc.2(storage: make the chunked upsert v2 stash time-major #40189). If the rollout statement is accurate, the earlier two are worth revisiting rather than left to age out.The other two holds stand, corroborated.
enable_mcp_protocol_2026_07_28still readsfalseat the ship tag and the five MCP PRs rc.1 held appear nowhere in the section; neither does the Console cluster-details page stack. In both cases you had the whole train in view and did not promote them — the confirmation rc.1 asked for, arriving in the negative.No duplicates, re-checked at ship. The seven PRs rc.1 flagged as already covered by v26.47.0 are still absent, the
## v26.47.1section is untouched, and rc.3's entry (#40065) appears exactly once.Two notes on human edits to this branch, both recorded as fact rather than objection:
524adb8removed the rc.1 feature section "Native Google Cloud Storage for persist" (#39983) outright. Flagging it only because a published entry disappearing is easy to miss in a long branch — if that was deliberate, nothing to do.EXCLUDE ALL NOT NULL CONSTRAINTS#39873), and a Guides section was added that is not in the skill's template. The lesson for next time: an option whose flag flipped totruein the same release more likely warrants a feature section than the Improvements bullet the rubric suggests by default.Carried forward from rc.3 and still open: the
K8s recovery: envd on failing nodenightly — the job that sank #40029, the first attempt at what #40065 re-lands — was not checked; it needs Buildkite, outside this run. The entry itself was verified correct in source at both the rc.3 and ship tags, so this is a CI-confidence question, not a notes-accuracy one.rc.3 increment
One Improvement, for #40065: a read-only
environmentdthat reboots to pick up DDL changes during zero-downtime upgrade catch-up now restarts in place rather than exiting its container, so Kubernetes no longer applies crash-restart backoff. Not inherited from rc.1 — rc.1 correctly omitted the first attempt (#40029) together with its revert (#40061) as a no-op onmain; rc.3 re-lands the behavior in narrowed form, verified as a real change by comparingentrypoint.shat thev26.47.0tag (no retry loop) againstv26.48.0-rc.3(re-exec on exit 75). The draft's closing "so zero-downtime upgrades catch up faster" was cut: no cited PR measures an upgrade duration, so the entry claims only the mechanism.MZ_RESTARTED_IN_PLACEmarker check keeps it from booting writable, so it cannot fence the leader — the failure Revert "environmentd: restart halts within the container (#40029)" #40061 reverted. Worth watching if 0dt reports look odd after this ships.rc.2 increment — empty, by design
rc.2's commit is empty: no entry was published and the provisional dates did not move. It exists so later runs can see from the commit subject that rc.2 was applied. Its single materialize PR, #40189, is the open item discussed under the
finalincrement above.rc.1 — standing warnings
mainfor v26.48.0. Four of the seven shipped to Cloud in v26.47.0 on 2026-10-22 — #37653, #39910, #39927, #40036 — so republishing any of them would put duplicate text in front of customers eight days later. The other three (#39903, #39906, #40046) were held at Borderline in v26.47.0 and are held again here, each reason re-checked rather than inherited. The "snapshots are disjoint by construction" guarantee holds within a train, not across trains, so this was caught mechanically by grepping every PR number in the issue against the v26.47.0 snapshot directories. All seven are listed under their own heading inrc.1/omitted.md.Open questions for the release owner
finalincrement above. The rollout statement on this branch has changed the picture since rc.2; this is the one item that needs a decision before merge.enable_mcp_protocol_2026_07_28still defaults tofalseat the ship tag. Omitted, with the absence of any MCP text on this branch taken as confirmation. Drafted wording remains inrc.1/omitted.mdif the flag flips.Resolved since rc.1: the Kafka sink headers framing question — the GA section on this branch answers it.
Verification notes — rc.1's Step 5 pass cut one drafted entry and rewrote four:
mz_persist_lease_timeout_readcannot distinguish a dead reader from a stuck one — and the follow-up it names is a Cloud alerting change. Nothing a customer observes changes.AT TIME ZONE. Reworded to what the table supports.environmentdaccept backlog (server-core: Raise the listen backlog to 1024 #40035): the author's hedge is kept — "less likely to be restarted", not eliminated, because the PR says "This makes the queue fill later, not never."Judgment calls a reviewer may want to revisit — #39605 is filed as an Improvement, not a Bug Fix: nothing was incorrect, an unbounded operation gained a bound and a knob. #40101 is filed as a Bug Fix rather than omitted under the internal-logging rule, because credentials reaching the logs is a security defect with a user-visible remedy; only credentials a user inlined rather than wrapped in a
SECRETwere affected.Snapshot drafts (with PR links) in mz-skills:
Borderline PRs omitted: rc.1: 12 — omitted.md#borderline, rc.2: 1 — omitted.md#borderline, rc.3: 0, final: 0
🤖 Generated with Claude Code